1
2
3
Siguiente
Deshacer una confirmación y rehacer
$ git commit -m "Algo terriblemente equivocado" # (0: Tu accidente)
$ git restablecer HEAD ~ # (1)
<< editar archivos según sea necesario >> # (2)
$ git add. # (3)
$ git commit -c ORIG_HEAD # (4)
Este comando es responsable de deshacer. Deshacerá su última confirmación sin modificar su árbol de trabajo (el estado de sus archivos en el disco). Deberá agregarlos nuevamente antes de poder confirmarlos nuevamente).
Realice correcciones en los archivos del árbol de trabajo.
git agrega todo lo que quieras incluir en tu nueva confirmación.
Confirme los cambios, reutilizando el mensaje de confirmación anterior. reset copió el cabezal antiguo a .git / ORIG_HEAD; confirmar con -c ORIG_HEAD abrirá un editor, que inicialmente contiene el mensaje de registro de la confirmación anterior y le permite editarlo. Si no necesita editar el mensaje, puede usar la opción -C.
Alternativamente, para editar la confirmación anterior (o simplemente su mensaje de confirmación), commit --amend agregará cambios dentro del índice actual a la confirmación anterior.
Para eliminar (no revertir) una confirmación que se ha enviado al servidor, es necesario reescribir el historial con git push origin master --force.
Otras lecturas
¿Cómo puedo volver a mover HEAD a una ubicación anterior? (Cabeza separada) y Deshacer confirmaciones
La respuesta anterior le mostrará git reflog, que puede usar para determinar el SHA-1 para el compromiso al que desea revertir. Una vez que tenga este valor, use la secuencia de comandos como se explicó anteriormente.
HEAD ~ es lo mismo que HEAD ~ 1. El artículo ¿Qué es HEAD en git? es útil si desea deshacer el compromiso de varias confirmaciones.
|
Deshacer una confirmación da un poco de miedo si no sabes cómo funciona. Pero en realidad es increíblemente fácil si lo entiendes. Te mostraré las 4 formas diferentes en las que puedes deshacer una confirmación.
opción 1: git reset --hard
Digamos que tiene esto, donde C es su HEAD y (F) es el estado de sus archivos.
(F)
A B C
↑
Maestro
Desea hacer un nuke commit C y nunca volver a verlo y perder todos los cambios en los archivos modificados localmente. Tu hiciste esto:
git reset - cabeza dura ~ 1
El resultado es:
(F)
A-B
↑
Maestro
Ahora B es la CABEZA. Debido a que usó --hard, sus archivos se restablecen a su estado en la confirmación B.
opción 2: git reset
Ah, pero supongamos que el commit C no fue un desastre, sino un poco equivocado. Desea deshacer la confirmación, pero conserve los cambios para editarlos un poco antes de realizar una mejor confirmación. Comenzando de nuevo desde aquí, con C como tu CABEZA:
(F)
A B C
↑
Maestro
Puede hacer esto, dejando el --hard:
git reset HEAD ~ 1
En este caso el resultado es:
(F)
A B C
↑
Maestro
En ambos casos, HEAD es solo un puntero a la última confirmación. Cuando haces un git reset HEAD ~ 1, le dices a Git que mueva el puntero HEAD hacia atrás una confirmación. Pero (a menos que use --hard) deja sus archivos como estaban. Así que ahora el estado de git muestra los cambios que había registrado en C. ¡No ha perdido nada!
opción 3: git reset --soft
Para el toque más ligero, incluso puede deshacer su confirmación, pero deje sus archivos y su índice:
git reset --Soft HEAD ~ 1
Esto no solo deja sus archivos en paz, incluso deja su índice solo. Cuando haga git status, verá que los mismos archivos están en el índice que antes. De hecho, justo después de este comando, podría hacer git commit y estaría rehaciendo el mismo commit que acababa de tener.
opción 4: hizo git reset --hard y necesita recuperar ese código
Una cosa más: suponga que destruye una confirmación como en el primer ejemplo, pero luego descubre que la necesita después de todo. Mala suerte, ¿verdad?
No, todavía hay una forma de recuperarlo. Escriba git reflog y verá una lista de (parciales) commit shas (es decir, hashes) en los que se ha movido. Busque el commit que destruyó y haga esto:
git checkout -b someNewBranchName shaYouDestroyed
Ahora ha resucitado ese compromiso. En realidad, las confirmaciones no se destruyen en Git durante unos 90 días, por lo que normalmente puedes volver atrás y rescatar una de la que no quisiste deshacerte.
|
Hay dos formas de "deshacer" su última confirmación, dependiendo de si ya ha hecho pública su confirmación (enviada a su repositorio remoto):
Cómo deshacer una confirmación local
Digamos que me comprometí localmente, pero ahora quiero eliminar ese compromiso.
registro de git
compromiso 101: compromiso incorrecto # Último compromiso. Esto se llamaría 'HEAD'.
commit 100: buen compromiso # Segundo hasta el último compromiso. Este es el que queremos.
Para restaurar todo a la forma en que estaba antes de la última confirmación, debemos restablecer la confirmación antes de HEAD:
git reset --soft HEAD ^ # Use --soft si desea mantener sus cambios
git reset --hard HEAD ^ # Use --hard si no le importa conservar los cambios que realizó
Ahora git log mostrará que nuestra última confirmación ha sido eliminada.
Cómo deshacer una confirmación pública
Si ya ha hecho públicas sus confirmaciones, querrá crear una nueva confirmación que "revertirá" los cambios que realizó en su confirmación anterior (HEAD actual).
git revert HEAD
Tus cambios ahora se revertirány listo para que te comprometas:
git commit -m 'restaurando el archivo que eliminé por accidente'
registro de git
commit 102: restaurar el archivo que eliminé por accidente
commit 101: eliminar un archivo que no necesitamos
commit 100: agregando un archivo que necesitamos
Para obtener más información, consulte Conceptos básicos de Git: deshacer cosas.
|
Agregue / elimine archivos para obtener las cosas de la manera que desee:
git rm classdir
git agregar sourcedir
Luego modifique el compromiso:
git commit --enmendar
La confirmación errónea anterior se editará para reflejar el nuevo estado del índice; en otras palabras, será como si nunca hubiera cometido el error en primer lugar.
Tenga en cuenta que solo debe hacer esto si aún no ha presionado. Si ha presionado, solo tendrá que realizar una corrección normalmente.
|
git rm yourfiles / *. class
git commit -a -m "borró todos los archivos de clase en la carpeta 'yourfiles'"
o
git reset - cabeza dura ~ 1
Advertencia: El comando anterior eliminará permanentemente las modificaciones a los archivos .java (y cualquier otro archivo) que deseaba confirmar.
El restablecimiento completo de HEAD-1 establecerá su copia de trabajo en el estado de la confirmación antes de su confirmación incorrecta.
|
Para cambiar la última confirmación
Reemplace los archivos en el índice:
git rm --cached * .class
git agregar * .java
Luego, si es una rama privada, modifique el compromiso:
git commit --enmendar
O, si es una rama compartida, haz una nueva confirmación:
git commit -m 'Reemplazar archivos .class con archivos .java'
(Para cambiar una confirmación anterior, use la increíble rebase interactiva).
ProTip ™: agregue * .class a un gitignore para evitar que esto vuelva a suceder.
Para revertir un compromiso
Enmendar una confirmación es la solución ideal si necesita cambiar la última confirmación, pero se restablece una solución más general.
Puede restablecer Git a cualquier compromiso con:
git reset @ ~ N
Donde N es el número de confirmaciones antes de HEAD, y @ ~ se restablece a la confirmación anterior.
Entonces, en lugar de enmendar la confirmación, puede usar:
git reset @ ~
git agregar * .java
git commit -m "Agregar archivos .java"
Consulte git help reset, específicamente las secciones sobre --soft --mixed y --hard, para una mejor comprensión de lo que hace.
Reflog
Si te equivocas, siempre puedes usar el reflog para encontrar confirmaciones descartadas:
$ git reset @ ~
$ git reflog
c4f708b HEAD @ {0}: restablecer: moviéndose a @ ~
2c52489 HEAD @ {1}: confirmación: se agregaron algunos archivos .class
$ git restablecer 2c52489
... y estás de vuelta donde empezaste
|
Utilice git revert .
Para obtener el ID de confirmación, simplemente use git log.
|
Si planeas deshacer una confirmación local por completo, cualquier cambio que hayas hecho en la confirmación, y si no te preocupas por eso, simplemente haz el siguiente comando.
git reset - cabeza dura ^ 1
(Este comando ignorará toda su confirmación y sus cambios se perderán por completo de su árbol de trabajo local). Si desea deshacer su confirmación, pero desea sus cambios en el área de preparación (antes de la confirmación como después de git add), haga el siguiente comando.
git restablecer --Soft HEAD ^ 1
Ahora sus archivos comprometidos entran en el área de preparación. Suponga que si desea eclipsar los archivos porque necesita editar algún contenido incorrecto, haga el siguiente comando
git reset HEAD
Ahora los archivos comprometidos deben venir del área preparada al área no preparada. Ahora los archivos están listos para editar, por lo que sea lo que sea que cambie, desea editarlo, agregarlo y realizar una nueva confirmación.
Más (enlace roto) (versión archivada)
|
Si tiene Git Extras instalado, puede ejecutar git undo para deshacer la última confirmación. git undo 3 deshará las últimas tres confirmaciones.
|
Quería deshacer las últimas cinco confirmaciones en nuestro repositorio compartido. Busqué la identificación de revisión a la que quería retroceder. Luego escribí lo siguiente.
mensaje> git reset --hard 5a7404742c85
HEAD está ahora en 5a74047 Se agregó una página más al catálogo
indicador> git push origin master --force
Total 0 (delta 0), reutilizado 0 (delta 0)
remoto: bb / acl: se permite neoneye. carga útil aceptada.
Para git@bitbucket.org: thecompany / prometheus.git
+ 09a6480 ... 5a74047 maestro -> maestro (actualización forzada)
aviso>
|
Prefiero usar git rebase -i para este trabajo, porque aparece una buena lista donde puedo elegir las confirmaciones de las que deshacerme. Puede que no sea tan directo como algunas otras respuestas aquí, pero se siente bien.
Elija cuántas confirmaciones desea enumerar, luego invoque así (para alistar las últimas tres)
git rebase -i HEAD ~ 3
Lista de muestra
Elija aa28ba7 Comprobación de cordura para el puerto RtmpSrv
elija la opción de versión c26c541 RtmpSrv
pick 58d6909 Mejor soporte de decodificación de URL
Luego, Git eliminará las confirmaciones para cualquier línea que elimine.
|
Cómo arreglar el compromiso local anterior
Use git-gui (o similar) para realizar una confirmación de git --amend. Desde la GUI puede agregar o eliminar archivos individuales de la confirmación. También puede modificar el mensaje de confirmación.
Cómo deshacer la confirmación local anterior
Simplemente restablezca su rama a la ubicación anterior (por ejemplo, usando gitk o git rebase). Luego, vuelva a aplicar sus cambios desde una copia guardada. Después de la recolección de basura en su repositorio local, será como si la confirmación no deseada nunca hubiera sucedido. Para hacer todo eso en un solo comando, use git reset HEAD ~ 1.
Palabrade advertencia: el uso descuidado de git reset es una buena manera de hacer que su copia de trabajo entre en un estado confuso. Recomiendo que los principiantes de Git eviten esto si pueden.
Cómo deshacer una confirmación pública
Realice una selección de cereza inversa (git-revert) para deshacer los cambios.
Si aún no ha realizado otros cambios en su rama, simplemente puede hacer ...
git revert - no editar HEAD
Luego, envíe su rama actualizada al repositorio compartido.
El historial de confirmaciones mostrará ambas confirmaciones, por separado.
Avanzado: Corrección de la rama privada en repositorio público
Esto puede ser peligroso; asegúrese de tener una copia local de la rama para repulgar.
También tenga en cuenta: no desea hacer esto si alguien más puede estar trabajando en la rama.
git push --delete (branch_name) ## eliminar la versión pública de la rama
Limpia tu sucursal localmente y luego repush ...
origen de git push (branch_name)
En el caso normal, probablemente no tenga que preocuparse de que el historial de confirmaciones de su rama privada sea impecable. Simplemente presione una confirmación de seguimiento (consulte 'Cómo deshacer una confirmación pública' más arriba), y luego, haga una combinación de aplastamiento para ocultar el historial.
|
Si desea deshacerlo permanentemente y ha clonado algún repositorio
El ID de confirmación puede ser visto por
registro de git
Entonces puedes hacer ...
git reset --hard
git push origin -f
|
Si ha cometido basura pero no ha presionado,
git reset --Soft HEAD ~ 1
HEAD ~ 1 es una abreviatura del compromiso antes de head. Alternativamente, puede consultar el SHA-1 del hash si desea restablecer. La opción --soft eliminará la confirmación, pero dejará todos los archivos modificados como "Cambios por confirmar", como lo pondría git status.
Si desea deshacerse de cualquier cambio en los archivos rastreados en el árbol de trabajo desde la confirmación antes del encabezado, use "--hard" en su lugar.
O
Si ya presionaste y alguien tiró, que suele ser mi caso, no puedes usar git reset. Sin embargo, puedes hacer un git revert,
git revert HEAD
Esto creará una nueva confirmación que revierte todo lo introducido por la confirmación accidental.
|
En SourceTree (GUI para GitHub), puede hacer clic con el botón derecho en la confirmación y realizar una 'Confirmación inversa'. Esto debería deshacer sus cambios.
En la terminal:
Alternativamente, puede utilizar:
git revert
O:
git reset --soft HEAD ^ # Use --soft si desea mantener sus cambios.
git reset --hard HEAD ^ # Use --hard si no le importa conservar los cambios.
|
Un solo comando:
git reset - suave 'HEAD ^'
¡Funciona muy bien para deshacer la última confirmación local!
|
Simplemente reinícielo haciendo el siguiente comando usando git:
git reset --Soft HEAD ~ 1
Explique: lo que hace git reset, básicamente se restablece a cualquier confirmación a la que le gustaría volver, luego, si la combina con la tecla suave, regresará, pero conservará los cambios en sus archivos, así que regresa a la etapa en la que se acaba de agregar el archivo, HEAD es el encabezado de la rama y si combina con ~ 1 (en este caso también usa HEAD ^), retrocederá solo una confirmación que sea lo que desee. ..
Creo los pasos en la imagen a continuación con más detalles para usted, incluidos todos los pasos que pueden ocurrir en situaciones reales y confirmando el código:
|
¿Cómo deshacer la última confirmación de Git?
Para restaurar todo a la forma en que estaba antes de la última confirmación, necesitamos restablecer la confirmación antes de HEAD.
Si no desea conservar los cambios que realizó:
git reset - cabeza dura ^
Si desea conservar sus cambios:
git reset --Soft HEAD ^
Ahora revisa tu registro de git. Mostrará que nuestra última confirmación ha sido eliminada.
|
"Restablecer el árbol de trabajo a la última confirmación"
git reset - cabeza dura ^
"Limpiar archivos desconocidos del árbol de trabajo"
git limpio
ver - Referencia rápida de Git
NOTA: Este comando eliminará su confirmación anterior, ¡así que utilícelo con precaución! git reset --hard es más seguro.
|
Utilice reflog para encontrar un estado correcto
git reflog
REFLOG ANTES DE RESET
Seleccione el reflog correcto (f3cb6e2 en mi caso) y escriba
git reset --hard f3cb6e2
Después de eso, el repositorio HEAD se restablecerá a ese HEADid
REGISTRO DESPUÉS DE RESET
Finalmente, el reflog se parece a la imagen de abajo
REFLOG FINAL
|
Primer intento:
git reflog
Le mostrará todas las posibles acciones que ha realizado en su repositorio, por ejemplo, confirmar, fusionar, extraer, etc.
Entonces hazlo:
git reset - Hard ActionIdFromRefLog
|
Deshacer la última confirmación:
git reset --soft HEAD ^ o git reset --soft HEAD ~
Esto deshará la última confirmación.
Aquí, suave significa reiniciar en la puesta en escena.
HEAD ~ o HEAD ^ significa moverse para confirmar antes que HEAD.
Reemplazar la última confirmación por una nueva confirmación:
git commit --amend -m "mensaje"
Reemplazará la última confirmación con la nueva confirmación.
|
De otra manera:
Verifique la rama que desea revertir, luego restablezca su copia de trabajo local de nuevo a la confirmación que desea que sea la más reciente en el servidor remoto (todo lo que viene después se irá adiós). Para hacer esto, en SourceTree hice clic derecho en y seleccioné "Restablecer BRANCHNAME a esta confirmación".
Luego navegue al directorio local de su repositorio y ejecute este comando:
git -c diff.mnemonicprefix = false -c core.quotepath = false push -v -f --tags REPOSITORY_NAMEBRANCHNAME: BRANCHNAME
Esto borrará todas las confirmaciones posteriores a la actual en su repositorio local, pero solo para esa rama.
|
Escriba git log y busque el último código hash de confirmación y luego ingrese:
git reset
|
En mi caso, accidentalmente cometí algunos archivos que no quería. Así que hice lo siguiente y funcionó:
git reset --Soft HEAD ^
git rm --cached [archivos que no necesita]
git add [archivos que necesitas]
git commit -c ORIG_HEAD
Verifique los resultados con gitk o git log --stat
|
Simple, ejecute esto en su línea de comando:
git reset --Soft HEAD ~
|
Hay dos escenarios principales
Aún no has presionado el compromiso
Si el problema fueron archivos adicionales que comprometió (y no los quiere en el repositorio), puede eliminarlos usando git rm y luego confirmando con --amend
git rm
También puede eliminar directorios completos con -r, o incluso combinarlos con otros comandos de Bash
git rm -r
git rm $ (buscar -nombre '* .class')
Después de eliminar los archivos, puede confirmar, con la opción --amend
git commit --amend -C HEAD # la opción -C es usar el mismo mensaje de confirmación
Esto reescribirá su confirmación local reciente eliminando los archivos adicionales, por lo que estos archivos nunca se enviarán en forma push y también serán eliminados de su repositorio .git local por GC.
Ya presionaste el compromiso
Puede aplicar la misma solución del otro escenario y luego hacer git push con la opción -f, pero no se recomienda ya que sobrescribe el historial remoto con un cambio divergente (puede estropear su repositorio).
En su lugar, debe realizar la confirmación sin --amend (recuerde esto sobre -amend`: esa opción reescribe el historial en la última confirmación).
|
Para un compromiso local
git reset --Soft HEAD ~ 1
o si no recuerda exactamente en qué compromiso está, puede usar
git rm --cached
Para un compromiso empujado
La forma correcta de eliminar archivos del historial del repositorio es usando git filter-branch. Es decir,
git filter-branch --index-filter 'git rm --cached ' HEAD
Pero te recomiendo que uses este comando con cuidado. Lea más en git-filter-branch (1) Página del manual.
|
Para restablecer la revisión anterior, eliminando permanentemente todos los cambios no confirmados:
git reset - cabeza dura ~ 1
|
¿QUÉ USAR, restablecer - suave o restablecer - duro?
Solo estoy agregando dos centavos por la respuesta de @ Kyralessa:
Si no está seguro de qué usar, elija --soft (utilicé esta convención para recordarlo --soft para mayor seguridad).
Por qué ?
Si elige - difícil por error, PERDERÁ sus cambios como no lo estaba antes.
Si elige --soft por error, puede lograr los mismos resultados que --hard aplicando comandos adicionales
git reset HEAD file.html
git checkout - file.html
Ejemplo completo
echo "algunos cambios ..."> archivo.html
git agregar archivo.html
git commit -m "confirmación incorrecta"
# Necesito reiniciar
git reset --hard HEAD ~ 1 (cancelar cambios)
# O
git reset --soft HEAD ~ 1 # Volver al ensayo
git reset HEAD file.html # volver al directorio de trabajo
git checkout - file.html # cancelar cambios
Los créditos son para @Kyralessa.
|
1
2
3
Siguiente
Pregunta muy activa. Gana 10 de reputación para responder a esta pregunta. El requisito de reputación ayuda a proteger esta pregunta del spam y de la actividad sin respuesta.
No es la respuesta que estás buscando? Lea otras preguntas con la etiqueta git version-control git-commit undo o formule su propia pregunta.